Class-Framework
view release on metacpan or search on metacpan
lib/Class/Framework.pm view on Meta::CPAN
package Class::Framework;
use warnings;
use strict;
use Class::Accessor ();
use Class::MethodVars ();
our $VERSION = '1.'.qw $Rev: 228 $[1];
sub insert_base($$) {
my ($package,$base) = @_;
eval "unshift(\@${package}::ISA,q($base))" unless $package->isa($base);
}
sub add_base($@) {
my ($package,@base) = @_;
eval "package $package; use base qw( @base ); 1" or die $@;
}
sub import {
shift; # I don't care about what package this is. You should never be @ISA = "Class::Framework".
my $package = caller;
for (my $i = 0; $i < @_; $i++) {
next unless $_[$i] eq '-base';
if (ref($_[$i+1]) and ref($_[$i+1]) eq 'ARRAY' and not grep { not /\A\w+(?:::\w+)*\z/ } @{$_[$i+1]}) {
add_base($package,@{$_[$i+1]});
splice(@_,$i,2);
last;
} elsif ( (not ref($_[$i+1])) and $_[$i+1]=~/\A\w+(?:::\w+)*\z/ ) {
add_base($package,$_[$i+1]);
splice(@_,$i,2);
last;
}
}
insert_base $package,"Class::Accessor";
insert_base $package,"Class::Framework::New";
eval "package $package; Class::MethodVars->import(\@_); 1" or die $@; # And this is where the rest of @_ is used...
my @fields = @{$Class::MethodVars::Configs{$package}->{fields}};
my @rwfields = @{$Class::MethodVars::Configs{$package}->{rwfields}};
my @rofields = @{$Class::MethodVars::Configs{$package}->{rofields}};
my @wofields = @{$Class::MethodVars::Configs{$package}->{wofields}};
# There are also "hiddenfields" which don't get accessors...
eval "package $package; use fields \@fields; 1" or die $@;
$package->mk_accessors(@rwfields) if @rwfields;
$package->mk_accessors(@rofields) if @rofields;
$package->mk_accessors(@wofields) if @wofields;
}
package Class::Framework::New;
use warnings;
use strict;
use Class::MethodVars; # Defaults - I only need __CLASS__ anyway.
sub new :ClassMethod {
my $fields;
if (@_ == 1 and ref($_[0]) and $_[0]->isa("HASH")) {
$fields = shift;
} elsif ((@_ % 2) == 0) {
$fields = {@_};
}
my $me = fields::new(__CLASS__); # Note that __CLASS__ could be different to __PACKAGE__!
%$me = %$fields if $fields;
if ($me->can("_INIT")) {
$me->_INIT(@_);
}
return $me;
( run in 0.942 second using v1.01-cache-2.11-cpan-97f6503c9c8 )