view Lib/IMPL/AppException.pm @ 261:93963ec449c5

sync
author sergey
date Fri, 28 Dec 2012 16:43:03 +0400
parents 0a228a35645c
children 89179bb8c388
line wrap: on
line source

package IMPL::AppException;
use strict;
use mro 'c3';
use overload
    '""' => 'ToString',
    'bool'     =>   sub { return 1; },
    'fallback' => 1;

use Carp qw(longmess shortmess);
use Scalar::Util qw(refaddr);

use IMPL::Const qw(:prop);
use IMPL::Resources::Strings {
	messageFormat => "Application exception"
};

use IMPL::declare {
    base => [
        'IMPL::Object' => '@_'
    ],
    props => [
        source => PROP_RO,
        callStack => PROP_RO,
        _cachedMessage => PROP_RW 
    ]
};

sub new {
	my $self = shift;
	
	my $instance = $self->next::method(@_);
    
    $instance->callStack(longmess);
    $instance->source(shortmess);
    
    return $instance;
}


sub message {
	my ($this) = @_;
	
	if (my $msg = $this->_cachedMessage) {
		return $msg;
	} else {
	   my $formatter = $this->can('messageFormat');
	   return $this->_cachedMessage($formatter->($this));
	}
}

sub ToString {
	my ($this) = @_;
	
	return join("\n", $this->message, $this->callStack);
}

sub throw {
	my $self = shift;
	
	die $self->new(@_);
}

1;