Completed
Pull Request — master (#11)
by James
10:00 queued 07:54
created

Application::boot()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 23
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

Changes 0
Metric Value
dl 0
loc 23
ccs 0
cts 17
cp 0
rs 8.5906
c 0
b 0
f 0
cc 6
eloc 12
nc 10
nop 0
crap 42
1
<?php namespace Intraxia\Jaxion\Core;
2
3
use Intraxia\Jaxion\Contract\Core\Application as ApplicationContract;
4
use Intraxia\Jaxion\Contract\Core\HasActions;
5
use Intraxia\Jaxion\Contract\Core\HasFilters;
6
use Intraxia\Jaxion\Contract\Core\HasShortcode;
7
use Intraxia\Jaxion\Contract\Core\Loader as LoaderContract;
8
use UnexpectedValueException;
9
10
/**
11
 * Class Application
12
 *
13
 * @package Intraxia\Jaxion
14
 */
15
class Application extends Container implements ApplicationContract {
16
	/**
17
	 * Define plugin version on Application.
18
	 */
19
	const VERSION = '';
20
21
	/**
22
	 * Singleton instance of the Application object
23
	 *
24
	 * @var Application[]
25
	 */
26
	protected static $instances = array();
27
28
	/**
29
	 * Instantiates a new Application container.
30
	 *
31
	 * The Application constructor enforces the presence of of a single instance
32
	 * of the Application. If an instance already exists, an Exception will be thrown.
33
	 *
34
	 * @param string $file
35
	 * @param array  $providers
36
	 *
37
	 * @throws ApplicationAlreadyBootedException
38
	 */
39 27
	public function __construct( $file, array $providers = array() ) {
40 27
		if ( isset( static::$instances[ get_called_class() ]) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
41 24
			throw new ApplicationAlreadyBootedException;
42
		}
43
44 3
		static::$instances[ get_called_class() ] = $this;
45
46 3
		$this->register_constants( $file );
47 3
		$this->register_core_services();
48
49 3
		register_activation_hook( $file, array( $this, 'activate' ) );
50 3
		register_deactivation_hook( $file, array( $this, 'deactivate' ) );
51
52 3
		parent::__construct( $providers );
53 3
	}
54
55
	/**
56
	 * {@inheritDoc}
57
	 *
58
	 * @throws UnexpectedValueException
59
	 */
60
	public function boot() {
61
		$loader = $this->fetch( 'loader' );
62
63
		if ( ! $loader instanceof LoaderContract ) {
64
			throw new UnexpectedValueException;
65
		}
66
67
		foreach ( $this as $alias => $value ) {
68
			if ( $value instanceof HasActions ) {
69
				$loader->register_actions( $value );
70
			}
71
72
			if ( $value instanceof HasFilters ) {
73
				$loader->register_filters( $value );
74
			}
75
76
			if ( $value instanceof HasShortcode ) {
77
				$loader->register_shortcode( $value );
78
			}
79
		}
80
81
		add_action( 'plugins_loaded', array( $loader, 'run' ) );
82
	}
83
84
	/**
85
	 * {@inheritdoc}
86
	 *
87
	 * @codeCoverageIgnore
88
	 */
89
	public function activate() {
90
		// no-op
91
	}
92
93
	/**
94
	 * {@inheritdoc}
95
	 *
96
	 * @codeCoverageIgnore
97
	 */
98
	public function deactivate() {
99
		// no-op
100
	}
101
102
	/**
103
	 * {@inheritDoc}
104
	 *
105
	 * @return Application
106
	 * @throws ApplicationNotBootedException
107
	 */
108 6
	public static function instance() {
109 6
		if ( ! isset( $instances[ get_called_class() ] ) ) {
0 ignored issues
show
Bug introduced by
The variable $instances seems to never exist, and therefore isset should always return false. Did you maybe rename this variable?

This check looks for calls to isset(...) or empty() on variables that are yet undefined. These calls will always produce the same result and can be removed.

This is most likely caused by the renaming of a variable or the removal of a function/method parameter.

Loading history...
110 6
			throw new ApplicationNotBootedException;
111
		}
112
113
		return static::$instances[ get_called_class() ];
114
	}
115
116
	/**
117
	 * {@inheritDoc}
118
	 */
119 30
	public static function shutdown() {
120 30
		if ( isset( $instances[ get_called_class() ] ) ) {
0 ignored issues
show
Bug introduced by
The variable $instances seems to never exist, and therefore isset should always return false. Did you maybe rename this variable?

This check looks for calls to isset(...) or empty() on variables that are yet undefined. These calls will always produce the same result and can be removed.

This is most likely caused by the renaming of a variable or the removal of a function/method parameter.

Loading history...
121
			unset( static::$instances[ get_called_class() ] );
122
		}
123 30
	}
124
125
	/**
126
	 * Sets the plugin's url, path, and basename.
127
	 *
128
	 * @param string $file
129
	 */
130 3
	private function register_constants( $file ) {
131 3
		$this->share( 'url', plugin_dir_url( $file ) );
132 3
		$this->share( 'path', plugin_dir_path( $file ) );
133 3
		$this->share( 'basename', $basename = plugin_basename( $file ) );
134 3
		$this->share( 'slug', dirname( $basename ) );
135 3
		$this->share( 'version', static::VERSION );
136 3
	}
137
138
	/**
139
	 * Registers the built-in services with the Application container.
140
	 */
141 3
	private function register_core_services() {
142
		$this->share( array( 'loader' => 'Intraxia\Jaxion\Contract\Core\Loader' ), function ( $app ) {
143
			return new Loader( $app );
0 ignored issues
show
Unused Code introduced by
The call to Loader::__construct() has too many arguments starting with $app.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
144 3
		} );
145 3
		$this->share( array( 'i18n' => 'Intaxia\Jaxion\Contract\Core\I18n' ), function ( $app ) {
146
			return new I18n( $app->fetch( 'basename' ), $app->fetch( 'path' ) );
147 3
		} );
148 3
	}
149
}
150