PHPackages                             holistic-agency/frozen - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. holistic-agency/frozen

Abandoned → [holistic-agency/decouple](/?search=holistic-agency%2Fdecouple)Library[Utility &amp; Helpers](/categories/utility)

holistic-agency/frozen
======================

decoupling interfaces

2.0.0(4mo ago)110MITPHPPHP &gt;=8.2

Since Oct 30Pushed 4mo ago2 watchersCompare

[ Source](https://github.com/holisticagency/decouple)[ Packagist](https://packagist.org/packages/holistic-agency/frozen)[ RSS](/packages/holistic-agency-frozen/feed)WikiDiscussions 2.0 Synced 1mo ago

READMEChangelogDependencies (2)Versions (5)Used By (0)

HolisticAgency/Decouple
=======================

[](#holisticagencydecouple)

Decoupling interfaces.

This package is a very light and agnostic set of interfaces and implementations designed to fake or render unpredictable return values of some PHP native functions dealing with external concerns.

Installation
------------

[](#installation)

```
composer require holistic-agency/decouple:^1.0
```

Usage
-----

[](#usage)

### ClockInterface

[](#clockinterface)

This package implememts `psr\clock`. See

The Clock `now()` method returns a new DateTimeImmutable object with the current time acccording to the php `date.timezone` setting.

The Frozen\\Clock `now()` method returns the DateTimeImmutable object passed to the constructor.

```
// src/MyClass.php
use HolisticAgency\Decouple\ClockInterface;
use Psr\Clock\ClockInterface;

class MyClass
{
    public function myMethod(ClockInterface $clock)
    {
        // some code ...

        $now = $clock->now()->format('Y-m-d H:i:s T');

        // some code ...
    }
}

// src/Elsewhere.php
use HolisticAgency\Decouple\Clock;

$myClass = new Myclass();
$myClass->myMethod(new Clock());

// tests/MyClassTest.php
use HolisticAgency\Decouple\Frozen\Clock;

class MyClassTest
{
    public function testMyMethod()
    {
        // Given
        $myTestClass = new MyClass();
        $frozen = new Clock(new DateTimeImmutable('2022-02-05 16:32:29 CET'));

        // When
        $actual = $myTestClass->myMethod($frozen);

        // Then
        // assert what you need
        // knowing $now is equal to '2022-02-05 16:32:29 CET'
        // inside myMethod()
    }
}
```

### NumberGeneratorInterface

[](#numbergeneratorinterface)

The MersenneTwister `draw()` method returns an integer from a `mt_rand()` call.

The Frozen\\NumberGenerator `draw()` method returns one of ordered values passed to the constructor cyclically.

```
$generator = new MersenneTwister();
$unknon = $generator->draw(); // an integer between 0 and PHP_INT_MAX included

$generator = new MersenneTwister(1, 6);
$diceType = 'D' . strval($generator->max); // D6
$diceRoll = $generator->draw() ; // an integer between 1 and 6 included
if ($diceRoll == $this->min) {
    echo $diceType . ' roll, you loose.'; // if 1 is rolled
}

$guesser = new Frozen\NumberGenerator(10, 17, 1);
$cheater = $guesser->draw(); // 10
$cheater = $guesser->draw(); // 17
$cheater = $guesser->draw(); //  1
$cheater = $guesser->draw(); // 10
```

### SystemInterface

[](#systeminterface)

methodnative PHP callfreeSpace($directory)disk\_free\_space($directory)documentRoot()$\_SERVER\['DOCUMENT\_ROOT'\] or empty string (`''`)pid()getmypid()umask()umask()### PlatformInterface

[](#platforminterface)

methodnative PHP callsapi()PHP\_SAPIversion()PHP\_VERSIONextensions()get\_loaded\_extensions()memory()ini\_get('memory\_limit') or empty string (`''`)### NetworkInterface

[](#networkinterface)

methodnative PHP callhostname()gethostname() or empty string (`''`)ipV4()gethostbyname()httpHost()$\_SERVER\['HTTP\_HOST'\] or empty stringresolve($remote)gethostbyname($remote) or empty stringdnsGetRecord(...).dns\_get\_record(...)Example
-------

[](#example)

```
// src/MyNetwork.php
use HolisticAgency\Decouple\NetworkInterface;

class MyNetwork
{
    public checkIfRemoteIsAvailable(NetworkInterface $network, string $remote): bool
    {
        return $network->resolve($remote) != '';
    }
}

// tests/MyNetworkTest.php
use HolisticAgency\Decouple\Frozen\Network as FrozenNetwork;

class MyNetworkTest
{
    public function testCheckIfRemoteIsAvailable()
    {
        // Given
        $myTestClass = new MyNetwork();
        $frozen = new FrozenNetwork(
            'production.local',
            '192.168.1.10',
            'app.my.org',
            ['proxy.inside.local' => '10.10.0.10'],
        );

        // When
        $actual1 = $myTestClass->checkIfRemoteIsAvailable($frozen, 'api.outside.net');
        $actual2 = $myTestClass->checkIfRemoteIsAvailable($frozen, 'proxy.inside.local');

        // Then
        // $actual1 is false
        // $actual2 is tue
    }
}
```

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance74

Regular maintenance activity

Popularity7

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~104 days

Total

5

Last Release

144d ago

Major Versions

1.x-dev → 2.0.02025-12-20

PHP version history (2 changes)1.0.0PHP &gt;=8.1

2.0.0PHP &gt;=8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/2a9b7beb8fec4f176788dc1378e297e457a983009dcd8e084ed7bfcea5cbb456?d=identicon)[James](/maintainers/James)

---

Top Contributors

[![JamesRezo](https://avatars.githubusercontent.com/u/6839893?v=4)](https://github.com/JamesRezo "JamesRezo (35 commits)")

---

Tags

interfacesdecouplingclockplatformsystemnetworkpseudo-randomnumber-generator

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/holistic-agency-frozen/health.svg)

```
[![Health](https://phpackages.com/badges/holistic-agency-frozen/health.svg)](https://phpackages.com/packages/holistic-agency-frozen)
```

###  Alternatives

[symfony/event-dispatcher-contracts

Generic abstractions related to dispatching event

3.4k756.5M424](/packages/symfony-event-dispatcher-contracts)[symfony/service-contracts

Generic abstractions related to writing services

2.6k860.1M360](/packages/symfony-service-contracts)[jenssegers/agent

Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect

4.8k67.8M440](/packages/jenssegers-agent)[symfony/clock

Decouples applications from the system clock

430168.9M205](/packages/symfony-clock)[beste/clock

A collection of Clock implementations

7423.3M20](/packages/beste-clock)[s1lentium/iptools

PHP Library for manipulating network addresses (IPv4 and IPv6)

2446.2M24](/packages/s1lentium-iptools)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
