On Thu, Aug 31, 2000 at 07:56:24PM -0700, Nathan Wiger wrote:

> > So the object would be left undefined?  That means this code:
> 
> No, not at all. Remember, everything's going to inherit from CORE, at
> the very least, which would have to provide a CREATE method which just
> instantiates a simple object.

Don't you mean UNIVERSAL, or did I miss an RFC?


> So, if no Dog::CREATE exists, then $spot becomes a regular old scalar. I
> see many many uses for this. For example, maybe you have a class that you
> just want to add a STRING sub to, so it prints out nice. Forcing a CREATE
> sub to be defined here is a needless restriction.

How is a regular scalar any better than undef?  It's actually worse,
potentially creating bugs that are even more difficult to spot.

    my Dog $spot = "Spot";  # no CREATE, $spot is now just "Spot"
    $spot->type("collie");  # Spot->type("collie") !


If you meant a reference, that's even worse.  Consider the DBI class; a
user, neglecting to read the documentation, tries:

    my DBI $dbh ($database_dsn, $database_username, $database_password);
    my $sth = $dbh->prepare( ... );

$dbh was blessed into the DBI class, but as a simple scalar.  Now the
prepare method gets a scalar reference where it was expecting a hash
reference.  I know of few classes that test their object to see if it's the
proper underlying reference, and I doubt DBI is any different.  It tries to
do something like $self->{'database_username'} and blows up rather
spectacularly, and the user sees an error deep inside of DBI.

If you meant a hash reference, there's a similar problem, though you'll see
warnings instead of fatal errors.  That is, assuming DBI uses a hash
reference (which it does, last time I checked, but this is just an example).

So, DBI is forced to provide a CREATE method if bugs are to be made easy to
track.  I would much rather the my DBI $dbh blow up then and there, so the
user gets instant feedback that they shouldn't do that with DBI.

DBI is a good example in another way; DBI->connect() returns a reference
blessed into the DBI::db class.  The default CREATE, if it returns a
reference, can only think to bless it into the DBI class.


Michael
--
Administrator                      www.shoebox.net
Programmer, System Administrator   www.gallanttech.com
--

Reply via email to