Firewall-Config-Element

 view release on metacpan or  search on metacpan

lib/Firewall/Config/Element/Service/Role.pm  view on Meta::CPAN

package Firewall::Config::Element::Service::Role;

#------------------------------------------------------------------------------
# 加载扩展模块
#------------------------------------------------------------------------------
use Carp;
use Moose::Role;
use Mojo::Loader qw(load_class);
use Firewall::Config::Element::ServiceMeta::Role;

#------------------------------------------------------------------------------
# 引入 Firewall::Config::Element::Role 角色
#------------------------------------------------------------------------------
with 'Firewall::Config::Element::Role';

#------------------------------------------------------------------------------
# Firewall::Config::Element::Service::Role 通用属性
#------------------------------------------------------------------------------
has srvName => ( is => 'ro', isa => 'Str', required => 1, );

has metas => ( is => 'ro', does => 'HashRef[Firewall::Config::Element::ServiceMeta::Role]', default => sub { {} }, );

has dstPortRangeMap => ( is => 'ro', isa => 'HashRef[Firewall::Utils::Set]', default => sub { {} }, );

has refnum => ( is => 'ro', isa => 'Int', default => 0 );

has range => ( is => 'ro', isa => 'Firewall::Utils::Set', lazy => 1, builder => '_buildRange', );

#------------------------------------------------------------------------------
# getServiceClassName 获取服务端口名
#------------------------------------------------------------------------------
sub getServiceClassName {
  my $self = shift;
  return ref($self);
}

#------------------------------------------------------------------------------
# getServiceClassName 获取原始端口(预定义)名
#------------------------------------------------------------------------------
sub getServiceMetaClassName {
  my ( $self, $serviceClassName ) = @_;
  my $serviceMetaClassName = $serviceClassName // $self->getServiceClassName;
  $serviceMetaClassName =~ s/::Service::/::ServiceMeta::/o;
  return $serviceMetaClassName;
}

#------------------------------------------------------------------------------
# Moose BUILDARGS 在实例创建之前生效,可以接收哈希和哈希的引用
# https://metacpan.org/pod/Moose::Manual::Construction
# https://metacpan.org/pod/Moose::Object
#------------------------------------------------------------------------------
around BUILDARGS => sub {
  my $orig             = shift;
  my $serviceClassName = shift;
  if ( @_ > 2 ) {
    my $serviceMetaClassName = $serviceClassName->getServiceMetaClassName($serviceClassName);

    #--------------------------------------------------------------------------
    # 尝试加载 serviceMetaClassName
    # https://metacpan.org/pod/Mojo::Loader#load_class
    #--------------------------------------------------------------------------
    if ( my $e = load_class $serviceMetaClassName) {
      die ref $e ? "Exception: $e" : "$serviceMetaClassName Not found!";
    }

    # 实例化 serviceMetaClassName
    my $metaObj = $serviceMetaClassName->new(@_);
    return $serviceClassName->$orig( @_, 'metas', {$metaObj->sign => $metaObj} );
  }
  else {
    return $serviceClassName->$orig(@_);
  }
};

#------------------------------------------------------------------------------
# Moose BUILD 用于对象创建后,进行属性检查逻辑
# https://metacpan.org/pod/Moose::Manual::Construction
#------------------------------------------------------------------------------
sub BUILD {
  my $self  = shift;
  my @metas = values %{$self->metas};
  for my $metaObj (@metas) {
    $self->mergeDstPortRangeMap($metaObj);



( run in 2.275 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )