Here's a Dog class which admits dynamic strong typing/value types, like I suggested in my replies to xdg and TimToady.
package Dog;
use Tie::Constrained;
use Scalar::Util qw/blessed/;
# constraint object
my $is_a_dog = Tie::Constrained->new(
sub { blessed $_[0] and $_[0]->isa('Dog') },
);
sub new {
bless {}, shift;
}
# not a constructor this time, ties the referent
sub MODIFY_SCALAR_ATTRIBUTES {
my $class = shift;
my $ref = shift;
tie $$ref, 'Tie::Constrained', $is_a_dog;
# ignore attributes for this example, but
# must have one to get called
();
}
sub bark {
my $self = shift;
print "Woof!\n";
}
package Cat;
sub new {
bless {}, shift;
}
package main;
my Dog $spot : Generic ;
eval {$spot->bark}
or warn q(Only tangible Dogs bark, ), $@;
eval {$spot = Cat->new}
or warn q(Can't be a Cat, ), $@;
eval {$spot = Dog->new}
or warn q(Major malfunction: ), $@;
eval {$spot->bark}
or warn q(Only tangible Dogs bark, ), $@;
Which prints,
Only tangible Dogs bark, Can't call method "bark" on an undefined value at dog.pl line 42.
Can't be a Cat, Constraint violation: at dog.pl line 44
Woof!
Declared attributes would likely be stored in %{tied($spot)}, which is persistent and independent of whatever is assigned the name. Matching declared attributes with Dog instance ones could be part of the constraint.
This is a very rough proof of concept. I haven't tried to make my $spot : Watchful = Dog->new; do the right thing. I haven't checked if it plays nice with fields.pm or Attribute::Handlers. I'd be surprised if it did at this stage.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.