Mercurial > pub > Impl
view Lib/IMPL/Config/Class.pm @ 193:8e8401c0aea4
sync
author | sergey |
---|---|
date | Tue, 10 Apr 2012 08:13:22 +0400 |
parents | 76515373dac0 |
children | a705e848dcc7 |
line wrap: on
line source
package IMPL::Config::Class; use strict; use warnings; use parent qw(IMPL::Config); use IMPL::Exception; use IMPL::Class::Property; BEGIN { public property Type => prop_all; public property Parameters => prop_all; public property IsSingleton => prop_all; private property _Instance => prop_all; } __PACKAGE__->PassThroughArgs; sub CTOR { my $this = shift; die new IMPL::Exception("A Type parameter is required") unless $this->Type; warn "IMPL::Config::Class is absolute, use IMPL::Config::Activator instead"; } sub _is_class { no strict 'refs'; scalar keys %{"$_[0]::"} ? 1 : 0; } sub instance { my $this = shift; my $type = $this->Type; if ($this->IsSingleton) { if ($this->_Instance) { return $this->_Instance; } else { my %args = (%{$this->Parameters || {}},@_); eval "require $type" unless _is_class($type); my $inst = $type->new(%args); $this->_Instance($inst); return $inst; } } else { my %args = (%{$this->Parameters || {}},@_); eval "require $type" unless _is_class($type); return $type->new(%args); } } 1;