Skip to content

Commit

Permalink
register_namespaceメソッド追加
Browse files Browse the repository at this point in the history
  • Loading branch information
Nishibayashi Takuji committed Nov 16, 2010
1 parent 53dbbb5 commit ce96db5
Showing 1 changed file with 52 additions and 13 deletions.
65 changes: 52 additions & 13 deletions lib/Object/Container/Namespace.pm
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,27 @@ sub import {
my $class = shift;
my $caller = caller;

if( $_[0] && $_[0] eq '-base' ) {
if ( $_[0] && $_[0] eq '-base' ) {

# base

{
no strict 'refs';
push @{"$caller\::ISA"},$class;
push @{"$caller\::ISA"}, $class;
}

my $instance_table = {};
my $instance_table = {};
my $registered_class = {};
{
no strict 'refs';
*{"$caller\::_instance_table"} = sub { $instance_table };
*{"$caller\::_registered_classes"} = sub { $registered_class };
*{"$caller\::register"} = sub { register($caller,@_) };
*{"$caller\::_instance_table"} = sub {$instance_table};
*{"$caller\::_registered_classes"} = sub {$registered_class};
*{"$caller\::register"} = sub { register( $caller, @_ ) };
}
$caller->initialize(@_);
}
else {

# export methods
my @export_names = @_;

Expand All @@ -42,26 +44,33 @@ sub import {
};
}

for my $export_name ( @export_names ) {
$class->register_namespace( $export_name );
}

}
}

sub initialize { 'DUMMY' }
sub initialize {'DUMMY'}

sub register {
my $class = shift;
my $pkg = shift;
my $initializer = $_[0];
my @options = @_;

unless ( $pkg ) {
unless ($pkg) {
Carp::croak("Register name is empty!");
}
unless ( defined $initializer && ref($initializer) eq 'CODE' && scalar @options == 1 ){
unless ( defined $initializer
&& ref($initializer) eq 'CODE'
&& scalar @options == 1 )
{
$initializer = sub {
my $self = shift;
$self->load_class($pkg);
$pkg->new(@options);
}
};
}

#register classes
Expand All @@ -75,9 +84,9 @@ sub get {

my $obj = $class->_instance_table->{$pkg};

unless ( $obj ) {
my $code = $class->_registered_class->{$pkg};
unless ( $code ) {
unless ($obj) {
my $code = $class->_registered_classes->{$pkg};
unless ($code) {
Carp::croak("$pkg is not registered!");
}
$obj = $code->($self);
Expand All @@ -86,6 +95,36 @@ sub get {
return $obj;
}

sub register_namespace {
my ( $class, $namespace ) = @_;

unless ($namespace) {
return;
}

my $self = ref($class) ? $class : $class->instance;
( my $basename = ref($class) ? ref($class) : $class )
=~ s/::[a-zA-Z0-9]+$//;

{
no strict 'refs';
*{"$class\::$namespace"} = sub {
my $pkg = shift;
my $class_name;
if( $pkg ) {
$class_name = join '::', $basename, camelize($namespace), camelize($pkg);
#initial access
if( $class->_registered_classes->{$class_name} ) {
register($class,$class_name);
}
}

return $pkg ? $class->get($class_name) : $class;
};
}

}

1;
__END__
Expand Down

0 comments on commit ce96db5

Please sign in to comment.